/**
 * 新数据结构 Map ：任何值(对象或者原始值) 都可以作为一个键或一个值
 * Maps 和 Objects 的区别
1. 一个 Object 的键只能是字符串或者 Symbols，但一个 Map 的键可以是任意值。
2. Map 中的键值是有序的（FIFO 原则），而添加到对象中的键则不是。
3. Map 的键值对个数可以从 size 属性获取，而 Object 的键值对个数只能手动计算。
4. Object 都有自己的原型，原型链上的键名有可能和你自己在对象上的设置的键名产生冲突。
 */
let map = new Map()
let keyStr = 'name'
map.set(keyStr, 'aqie')
console.log(map.get(keyStr))

let keyObj = {}
map.set(keyObj, 'key是对象')
console.log(map.get(keyObj))

// 迭代
/* for (let [key, value] of map) {
  console.log(key + " = " + value);
}

for (let [key, value] of map.entries()) {
  console.log(key + " = " + value);
}

for (var value of map.values()) {
  console.log(value);
}

map.forEach(function(value, key) {
  console.log('foreach' + key + " = " + value);
}, map) */


// map 转数组
var kvArray = [["key1", "value1"], ["key2", "value2"]];
 
// Map 构造函数可以将一个 二维 键值对数组转换成一个 Map 对象
var myMap = new Map(kvArray);
 
// 使用 Array.from 函数可以将一个 Map 对象转换成一个二维键值对数组
var outArray = Array.from(myMap);

console.log(myMap, outArray, typeof(outArray))


// map 克隆
var original = new Map([["key1", "value1"], ["key2", "value2"]]);
var clone = new Map(original);
 
console.log(original === clone); // 打印 false。 Map 对象构造函数生成实例，迭代出新的对象。

// map 合并
var first = new Map([[1, 'one'], [2, 'two'], [3, 'three'],]);
var second = new Map([[1, 'uno'], [2, 'dos']]);
 
// 合并两个 Map 对象时，如果有重复的键值，则后面的会覆盖前面的，对应值即 uno，dos， three
var merged = new Map([...first, ...second]);
console.log(merged)



/**
 * 拓展 map() 原数组映射成一个新的数组
 */
var obj = [
  {name:'小明',age:16,sex:'男'},
  {name:'小红',age:17,sex:'女'},
  {name:'小白',age:18,sex:'女'},
]
function getNewArray(obj){
  return obj.map( item => {
    return {
      name: item.name,
      age: item.age,
    };
  })
}

console.log(getNewArray(obj))
